package com.tx.core.ddlutil.builder;

import com.tx.core.ddlutil.model.TableColumnDef;
import com.tx.core.ddlutil.model.TableIndexDef;
import com.tx.core.starter.component.DatabaseTypeEnum;

import java.math.BigDecimal;
import java.util.List;

/**
 * 建表DDL构建器<br/>
 * <功能详细描述>
 *
 * @author Administrator
 * @version [版本号, 2016年11月6日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
//TODO: 后续考虑增加如果字段需要设置为 NCHAR NVARCHAR NCLOB CLOB BLOB的支撑
public interface DDLBuilder<B extends DDLBuilder<B>> {

    /**
     * 设置主键字段<br/>
     * @param columnNames
     * @return
     */
    B setPrimaryKeyColumnNames(String... columnNames);

    /**
     * 新增字段<br/>
     * @param tableColumn
     * @return
     */
    B newColumn(TableColumnDef tableColumn);

    /**
     * 增加非主键Varchar字段<br/>
     * @param columnName
     * @param size
     * @param required
     * @param defaultValue
     * @return
     */
    B newColumnOfVarchar(String columnName, int size,
                         boolean required, String defaultValue);

    /**
     * 添加非主键Integer字段<br/>
     * @param columnName
     * @param required
     * @param defaultValue
     * @return
     */
    B newColumnOfInteger(String columnName, boolean required,
                         Integer defaultValue);

    /**
     * 新增时间字段<br/>
     * @param columnName
     * @param size
     * @param required
     * @param defaultValue
     * @return
     */
    B newColumnOfInteger(String columnName, int size,
                         boolean required, Integer defaultValue);

    /**
     * 新增时间字段<br/>
     * @param columnName
     * @param required
     * @param isDefaultNow
     * @return
     */
    B newColumnOfDate(String columnName, boolean required,
                      boolean isDefaultNow);

    /**
     * 添加一个Boolean类型对应的字段：从兼容性考虑，统一使用Bit去表示一个boolean类型<br/>
     * @param columnName
     * @param required
     * @param defaultValue
     * @return
     */
    B newColumnOfBoolean(String columnName, boolean required,
                         Boolean defaultValue);

    /**
     * 新增一个decimal类型的字段<br/>
     * @param columnName
     * @param size
     * @param scale
     * @param required
     * @param defaultValue
     * @return
     */
    B newColumnOfBigDecimal(String columnName, int size,
                            int scale, boolean required, BigDecimal defaultValue);

    /**
     * 添加索引<br/>
     * @param ddlIndex
     * @return B
     */
    B newIndex(TableIndexDef ddlIndex);

    /**
     * 新增非唯一键索引<br/>
     * @param indexName
     * @param columnNames
     * @return B
     */
    B newIndex(String indexName, String columnNames);

    /**
     * 新增表索引<br/>
     * @param unique
     * @param indexName
     * @param columnNames
     * @return B
     */
    B newIndex(boolean unique, String indexName,
               String columnNames);

    /**
     * 获取所有字段的定义
     * @return List<? extends TableColumnDef>
     */
    List<? extends TableColumnDef> getColumns();

    /**
     * 获取所有索引的定义<br/>
     * @return List<? extends TableIndexDef>
     */
    List<? extends TableIndexDef> getIndexes();

    /**
     * 获取数据库类型<br/>
     * @return DatabaseTypeEnum
     */
    DatabaseTypeEnum getDatabaseType();
}